home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Leser 15 / Amiga Plus Leser CD 15.iso / Tools / Development / PluginSRC_EvenMore / msword2text3.e < prev    next >
Text File  |  2002-03-12  |  8KB  |  339 lines

  1. /*
  2.    MSWord2Text
  3.    EvenMore FileIO plugin
  4.    Author: Chris Perver
  5.    Copyright (c) 2001
  6. */
  7.  
  8.  
  9. OPT REG=5
  10.  
  11. LIBRARY 'msword2text.plugin',1,1,'MSWord 1.31' IS em_main, em_end, em_info, em_pluginid, em_begin, em_format
  12.  
  13. MODULE 'tools/ctype', '*epo'
  14.  
  15. DEF mem2:PTR TO CHAR, mswvers
  16.  
  17.  
  18. PROC em_isdatatype(memadr, lenadr)
  19.    DEF tstr[20]:STRING ->ARRAY OF LONG
  20.    DEF mswordfmtcount = 0
  21.    DEF notdone = TRUE
  22.    DEF mswordvers = 0
  23.    DEF w:PTR TO LONG
  24.     -> Find Word header
  25.  
  26.    w := Long(memadr)
  27.     IF w = $D0CF11E0
  28.       WHILE notdone
  29.         IF memadr[mswordfmtcount] = "W"
  30.           StrCopy(tstr, memadr + mswordfmtcount, 20)
  31.           LowerStr(tstr)
  32.        ->   IF InStr(tstr,'msworddoc') = 0
  33.           IF InStr(tstr,'word.document') = 0
  34.             mswordvers := Val(memadr + mswordfmtcount + 14) -> 28)   -> Get word version
  35.             notdone := FALSE
  36.           ENDIF
  37.         ENDIF
  38.         INC mswordfmtcount
  39.         EXIT (mswordfmtcount = lenadr)
  40.       ENDWHILE
  41.     ENDIF
  42. ENDPROC mswordvers
  43.  
  44.  
  45. PROC em_parsedata(epo:PTR TO em_pluginobj, wordvers)
  46.   DEF memadr:PTR TO CHAR, lenadr
  47.   DEF count = 0, count2 = 0, tempstr[10]:STRING
  48.   DEF wrapping = 80, notdonewrapping = TRUE, currchar = 0
  49.   DEF notdone = TRUE, lastcount
  50.  
  51.   -> Allocate memory for file
  52. ->  IF (mem2 := New(lenadr + 1)) = NIL THEN RETURN -1
  53. ->  mem2[lenadr + 1] := "\n"                                                      -> Put safety LF at the end of mem
  54.  
  55.   memadr := epo.buffer
  56.   lenadr := epo.length
  57.  
  58.   mem2 := epo.nbuffer
  59.  
  60.  
  61.  -> mem2 := memadr
  62.  
  63.    -> FIND START OF TEXT
  64.    WHILE notdone AND (count < lenadr)
  65.      -> FIND START OF TEXT
  66.      WHILE memadr[count] <> "\b" DO INC count
  67.      lastcount := count
  68.      WHILE memadr[count] <> $00  DO DEC count
  69.      INC count
  70.  
  71.      SELECT count
  72.        CASE 1280; notdone := FALSE
  73.        CASE 1536; notdone := FALSE
  74.        CASE 2560; notdone := FALSE
  75.        DEFAULT;   count := lastcount + 1
  76.      ENDSELECT
  77.    ENDWHILE
  78.  
  79.    notdone := TRUE
  80.  
  81.    WHILE notdone AND (count < lenadr)
  82.      IF (currchar >= wrapping)
  83.        WHILE notdonewrapping
  84.          SELECT 256 OF memadr[count]
  85.            CASE $00
  86.              DEC count
  87.            DEFAULT
  88.              IF isspace(memadr[count]) = FALSE
  89.                DEC count
  90.                DEC count2
  91.              ELSE
  92.                notdonewrapping := FALSE
  93.              ENDIF
  94.          ENDSELECT
  95.        ENDWHILE
  96.        INC count
  97.  
  98.        currchar := 0
  99.        mem2[count2++] := "\b"
  100.        mem2[count2++] := "\n"
  101.        notdonewrapping := TRUE
  102.      ENDIF
  103.  
  104.      SELECT 256 OF memadr[count]
  105.  
  106.        -> 00
  107.        CASE $00
  108.      ->    notdone := FALSE
  109.       ->   WriteF('quit\n')
  110.          SELECT wordvers
  111.            CASE 8
  112.            CASE 6
  113.              DEC count2
  114.              notdone := FALSE
  115.          ENDSELECT
  116.  
  117.  
  118.        -> A with leg
  119.        CASE $05
  120.          mem2[count2++] := "a"
  121.          INC currchar
  122.  
  123.        -> CR
  124.        CASE $0d ->"\b"
  125.        ->  WriteF('\d\n', count2)
  126.          IF (memadr[count + 1] = $00)
  127.        ->    WriteF('quit2\n')
  128.            IF (memadr[count + 2] = $00)
  129.              notdone := FALSE
  130.            ENDIF
  131.          ENDIF
  132.          mem2[count2++] := memadr[count]
  133.          mem2[count2++] := "\n"         -> Add LF for printing compatibility
  134.          currchar := 0
  135.  
  136.        -> ?
  137.        CASE $15
  138.  
  139.        -> e with tilde
  140.        CASE $19
  141.          mem2[count2++] := "e"
  142.          INC currchar
  143.  
  144.        -> Hidden forms ESC
  145.        CASE $13
  146.          INC count
  147.          -> EXTRA LONG DASH
  148.  
  149.          IF memadr[count + 1] = $20
  150.            mem2[count2++] := "-"
  151.            INC count
  152.          ELSE
  153.            StrCopy(tempstr, memadr + count)
  154.            IF InStr(tempstr, 'HYPERLINK')>=0
  155.              mem2[count2++] := "\e"
  156.              mem2[count2++] := "["
  157.              mem2[count2++] := "4"
  158.              mem2[count2++] := ";"
  159.              mem2[count2++] := "3"
  160.              mem2[count2++] := "3"
  161.              mem2[count2++] := "m"
  162.            ENDIF
  163.  
  164.            WHILE memadr[count] <> $14 DO INC count
  165.          ENDIF
  166.  
  167.        -> "
  168.        CASE $93, $94
  169.          mem2[count2++] := $22
  170.          INC currchar
  171.  
  172.        -> ...
  173.        CASE $85
  174.          mem2[count2++] := "."
  175.          mem2[count2++] := "."
  176.          mem2[count2++] := "."
  177.          currchar := currchar + 3
  178.  
  179.        -> BOX
  180.        CASE "ð"
  181.          IF memadr[count-1] = "p"
  182.            DEC count2
  183.            mem2[count2++] := "O"
  184.            INC currchar
  185.          ENDIF
  186.  
  187.        -> $0c TITLES
  188.        CASE $0c
  189.          mem2[count2++] := "\e"
  190.          mem2[count2++] := "["
  191.          mem2[count2++] := "1"
  192.          -> Big title
  193.          IF mem2[count+1] = $0c
  194.            mem2[count2++] := ";"
  195.            mem2[count2++] := "2"
  196.            INC count
  197.            IF mem2[count+1] = $0c
  198.              mem2[count2++] := ";"
  199.              mem2[count2++] := "3"
  200.              INC count
  201.            ENDIF
  202.          ENDIF
  203.          mem2[count2++] := "m"
  204.  
  205.  
  206.        -> Special chars
  207.        CASE $08
  208.  
  209.        -> ?
  210.        CASE $01
  211.  
  212.        -> APOSTROPHE
  213.        CASE $91
  214.          mem2[count2++] := "`"
  215.          INC currchar
  216.  
  217.        CASE $92
  218.          mem2[count2++] := "'"
  219.          INC currchar
  220.  
  221.        -> DASH
  222.        CASE $96
  223.          mem2[count2++] := "-"
  224.          INC currchar
  225.  
  226.        -> More foreign chars
  227.        CASE "B"
  228.          SELECT 256 OF memadr[count + 1]
  229.            -> L with a dash through it
  230.            CASE $01
  231.              mem2[count2++] := "l"
  232.              INC currchar
  233.              INC count
  234.            DEFAULT
  235.              mem2[count2++] := "B"
  236.              INC currchar
  237.          ENDSELECT
  238.  
  239.        -> TABLE
  240.        CASE $07
  241.          -> Break line
  242.  
  243.          SELECT 256 OF memadr[count + 1]
  244.            -> e with tilde
  245.            CASE $01
  246.              mem2[count2++] := "é"
  247.              INC currchar
  248.              INC count
  249.            -> End of cell in table
  250.            CASE $07
  251.              -> If another tab broken by $00, break line
  252.  
  253.                mem2[count2++] := "\b"
  254.                currchar := 0
  255.                WHILE memadr[count + 1] = $07 DO INC count
  256.              -> Skip on to next table
  257.            ->  ENDIF
  258.            CASE $00
  259.              IF memadr[count + 2] = $07
  260.                -> wee break
  261.                mem2[count2++] := "\b"
  262.                currchar := 0
  263.                count := count + 2
  264.                IF memadr[count + 1] = $00
  265.                  -> big break
  266.                  INC count
  267.                  IF memadr[count + 2] = $07
  268.                    INC count
  269.                    ->count := count + 2
  270.                  ENDIF
  271.                ENDIF
  272.              ELSE
  273.                -> Skip to next text
  274.                WHILE memadr[count + 1] = $00 DO INC count
  275.                mem2[count2++] := "\t"
  276.                INC currchar
  277.              ENDIF
  278.            -> Tab to show split between table
  279.            DEFAULT
  280.              mem2[count2++] := "\t"
  281.              INC currchar
  282.          ENDSELECT
  283.  
  284.        -> SIMILAR TABLE CHAR TO 07
  285.        CASE $0B
  286.          mem2[count2++] := "\b"
  287.          mem2[count2++] := "\t"
  288.          currchar := 1
  289.  
  290.        DEFAULT
  291.          mem2[count2++] := memadr[count]
  292.          INC currchar
  293.      ENDSELECT
  294.      INC count
  295.  
  296.    ENDWHILE
  297.  
  298.   mem2[count2++] := "\b"
  299.   mem2[count2]   := "\n"
  300.  
  301.  -> IF memadr
  302.  ->   Dispose(memadr); memadr := NIL
  303.  -> ENDIF
  304. -> WriteF('\d\n', count2)
  305. ENDPROC mem2, count2
  306. -><
  307.  
  308. -> *** STANDARD PROCS FOR PLUGINS
  309.  
  310.  
  311. PROC em_main(epo:PTR TO em_pluginobj)
  312.     DEF len2
  313.     mem2, len2 := em_parsedata(epo, mswvers)
  314.   ->  epo.buffer := mem2
  315.   ->  epo.length := len2
  316.   ->  WriteF('\d\n', len2)
  317.     epo.nlength := len2
  318.     RETURN TRUE
  319. ENDPROC
  320.  
  321. PROC em_begin(epo:PTR TO em_pluginobj)
  322.   mswvers := em_isdatatype(epo.buffer, epo.length)
  323.   IF (mswvers = 8) OR (mswvers = 6)
  324.     RETURN "MEM", (epo.length * 2)
  325.   ELSE
  326.     RETURN FALSE
  327.   ENDIF
  328. ENDPROC
  329.  
  330. PROC em_end()      IS EMPTY
  331.  
  332. PROC em_info()     IS 'MSWord2Text 1.31'
  333.  
  334. PROC em_pluginid() IS "FILE"
  335.  
  336. PROC em_format()   IS 'MSWord'
  337.  
  338. PROC main()        IS EMPTY
  339.